/*************************************************************************
	> File Name: 004.HZOJ332.买票.cpp
	> Author: Maureen 
	> Mail: Maureen@qq.com 
	> Created Time: 一  2/22 18:38:31 2021
 ************************************************************************/

/**
 *题目描述
有𝑁个人排队，每一个人都有一个𝑣𝑎𝑙来对应，每一个后来人都会插入当前队伍的某一个位置𝑝𝑜𝑠。要求把队伍最后的状态输出。

输入
第一行一个整数𝑁(1≤𝑁≤200,000)，表示𝑛个人，接下来𝑛行，每行两个整数𝑥和𝑣𝑎𝑙(0≤𝑥≤𝑖−1，0≤𝑣𝑎𝑙≤32767)，表示一个标记为𝑣𝑎𝑙的人，插入到排在第𝑥位置的人的后面。

输出
从前往后，输出所有的𝑣𝑎𝑙。
 */

//分析：x的值表示的就是前面有几个数,等同于排名第几,和HZOJ331.Lost_cows思路一致


#include <iostream>
using namespace std;

#define lowbit(x) (x & -x)
#define MAX_N 200000
int c[MAX_N + 5];
int val[MAX_N + 5];
int cnt[MAX_N + 5];
int ind[MAX_N + 5];
int ans[MAX_N + 5];
int n;

void add(int i, int x, int n) {
    while (i <= n) {
        c[i] += x;
        i += lowbit(i);
    }
    return ;
} 

int query(int i) {
    int sum = 0;
    while (i) {
        sum += c[i];
        i -= lowbit(i);
    }
    return sum;
}

int binary_search(int n, int val) {
    int head = 1, tail = n; 
    while (head < tail) {
        int mid = (head + tail) >> 1;
        if (query(mid) < val) head = mid + 1;
        else tail = mid;
    } 
    return head;
}

void solve() {
    for (int i = n; i >= 1; i--) {
        ind[i] = binary_search(n, cnt[i] + 1);
        add(ind[i], -1, n);
        ans[ind[i]] = val[i];
    }
    return ;
}

void output() {
    for (int i = 1; i <= n; i++) {
        i == 1 || cout << " ";
        cout << ans[i];
    }
    return ;
}


int main() {
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> cnt[i] >> val[i];
        add(i, 1, n);
    }
    solve();
    output();
    cout << endl;
    return 0;
}
